package xnj.lazydog.btcontroller.ControlViews;


import android.util.Log;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Project implements Serializable {

    public static final int TRANS_MODE_LISTENER = 1;
    public static final int TRANS_MODE_SEND_ALWAYS = 0;
    public static final int TRANS_MODE_SEND_ON_CONTROL = 2;

    public int theme = 0;

    //// 收发数据通道
    List<String> [] txData = new List[5];
    List<String> [] rxData = new List[5];

    public static int DEFAULT_TRANS_MS = 50;

    public int transMode = TRANS_MODE_SEND_ALWAYS;
    public int transPeriodMs = DEFAULT_TRANS_MS;
    public int controlPeriodMs = 30;
    public int repeatTimes = 2;
    ////

    List<ViewOptions> elements = new ArrayList<>();

    List<Value> [][] values;

    public Project()
    {
        values = new ArrayList[2][5];

        for(int i=0;i<5;i++) {
        txData[i] = new ArrayList<String>();
        rxData[i] = new ArrayList<String>();
        values[0][i] = new ArrayList<>();
        values[1][i] = new ArrayList<>();
        }
    }

    ////  在某条变量被删除后，重新进行链接映射，因为中间的变量如果被删除，列表中后面的变量会自动填补上来，而而这并不是我们想要的。
    ////    我们想要的效果是 将所有关于 "被删除变量" 的控件其对应的连接抹除，将链接清除。同时更重要的是，针对由于删除导致的变量的索引移位，
    ///   对每个移位的变量，对于每个关联该移位变量的控件，都要将其链接的索引值更新（向前挪一位）。
    ///   这是在删除元素后执行的，因此其变量列表的长度比原来的-1
    void changeLinkMapAfterDelete(int data_dir,int data_type,int data_index)
    {
        List [] data;
        if(data_dir==0)
            data = txData;
        else
            data = rxData;

        Log.w("DELETE","index:"+data_index+"  length:"+data[data_type].size());

        ViewOptions options;
        for(int i=0;i<elements.size();i++)
        {
            options = elements.get(i);
            options.removeLinkAuto(data_dir,data_type,data_index);

            for( ;data_index<data[data_type].size();data_index++)
                options.remapLinkAuto(data_dir,data_type,data_index);

            for(Link l:options.links)
            {
                if(l!=null)
                    Log.w("DELETE","link:"+l.dir+"-"+l.type+"-"+l.index);
                else
                    Log.w("DELETE","link: null");
            }
        }
    }

    int [] getTxChannelBytes()
    {
        int [] bytes = new int[7];
        bytes[0] = 1;
        bytes[1] = (txData[0].size()+7)/8;
        bytes[2] = txData[1].size();
        bytes[3] = txData[2].size()*2;
        bytes[4] = txData[3].size()*4;
        bytes[5] = txData[4].size()*4;
        bytes[6] = 2;
        return bytes;
    }
    int [] getRxChannelBytes()
    {
        int [] bytes = new int[7];
        bytes[0] = 1;
        bytes[1] = (rxData[0].size()+7)/8;
        bytes[2] = rxData[1].size();
        bytes[3] = rxData[2].size()*2;
        bytes[4] = rxData[3].size()*4;
        bytes[5] = rxData[4].size()*4;
        bytes[6] = 2;
        return bytes;
    }
}
